// 求任意两个节点的最低公共祖先
// 有关LCA问题的介绍：https://oi-wiki.org/graph/lca/
// LCA模板见灵神题解，链接如下：
// https://leetcode.cn/problems/kth-ancestor-of-a-tree-node/solutions/2305895/mo-ban-jiang-jie-shu-shang-bei-zeng-suan-v3rw/
// 测试链接：https://www.luogu.com.cn/problem/P3379
// 提交以下所有代码，可以直接通过

#include <bits/stdc++.h>

using namespace std;

const int MAXN = 500010;

int depth[MAXN];
int fa[MAXN][32];

// 链式前向建图见左神的讲解059
int head[MAXN];
int next[MAXN << 1];
int to[MAXN << 1];
int cnt = 1;

int n, m, root, high;

// 快读
int read()
{
    char ch = getchar();
    int x = 0, f = 1;
    while(ch < '0' || ch > '9')
    {
        if(ch == '-') f = -1;
        ch = getchar();
    }

    while(ch >= '0' && ch <= '9')
    {
        x = 10 * x + ch - '0';
        ch = getchar();
    }
    return f * x;
}

// 链式前向星加边
void addEdge(int u, int v)
{
    ::next[cnt] = head[u];
    to[cnt] = v;
    head[u] = cnt++;
}

// dfs 设置父亲和求深度
void dfs(int x, int father)
{
    fa[x][0] = father, depth[x] = depth[father] + 1;
    // 链式前向星遍历
    for(int ei = head[x]; ei; ei = ::next[ei])
    {
        int v = to[ei];
        if(v != father)
        {
            dfs(v, x);
        }
    }
}

// 设置祖先
void setAncestor()
{
    for(int i = 0; i < high - 1; ++i)
    {
        for(int x = 1; x <= n; ++x)
        {
            if(int p = fa[x][i]; p != 0)
            {
                fa[x][i + 1] = fa[p][i];
            }
        }
    }
}

// 返回节点 x 的第 k 个祖先，没有返回 0
int getKthAncestor(int x, int k)
{
    for(; k; k &= k - 1)
    {
        x = fa[x][__builtin_ctz(k)];
    }
    return x;
}

// 返回 x 和 y 的最近公共祖先（节点编号从 1 开始）
int getLCA(int x, int y)
{
    // 默认 y 节点深度是较深的
    if(depth[x] > depth[y]) swap(x, y);
    // 使 y 和 x 在同一深度
    y = getKthAncestor(y, depth[y] - depth[x]);
    if(y == x) return x;

    for(int i = high - 1; i >= 0; --i)
    {
        int fx = fa[x][i], fy = fa[y][i];
        // 父亲不同，则说明最近公共祖先还在上面，则需要继续
        // 往上跳，反之不往上跳
        if(fx != fy)
        {
            x = fx;
            y = fy;
        } 
    }
    return fa[x][0];
}

int main()
{
    n = read(), m = read(), root = read();
    for(int i = 1; i < n; ++i)
    {
        int x = read(), y = read();
        addEdge(x, y);
        addEdge(y, x);
    }
    dfs(root, 0); // root 的根节点为 0

    // n = 5 -> 101
    // high = 32 - 29 = 3
    // 则每个节点最多有 2 ^ (high - 1) = 4 个祖先
    high = 32 - __builtin_clz(n);
    setAncestor();

    for(int i = 1; i <= m; ++i)
    {
        int x = read(), y = read();
        printf("%d\n", getLCA(x, y));
    }

    return 0;
}